package main

import "fmt"

/*

一个指针变量指向了一个值的内存地址。

类似于变量和常量，在使用指针前你需要声明指针。指针声明格式如下：

var var_name *var-type
var-type 为指针类型，var_name 为指针变量名，* 号用于指定变量是作为一个指针。以下是有效的指针声明：

var ip *int         指向整型
var fp *float32     指向浮点型

*/
func main() {
	var test int = 10
	fmt.Println("变量的值", test)
	fmt.Printf("变量的地址: %x\n", &test)

	/*
		指针的声明，指针指向变量，指针访问变量的值
	*/
	var a int = 20 /* 声明实际变量 */
	var ip *int    /* 声明指针变量 */

	ip = &a /* 指针变量的存储地址 */

	fmt.Printf("a 变量的地址是: %x\n", &a)

	/* 指针变量的存储地址 */
	fmt.Printf("ip 变量储存的指针地址: %x\n", ip)

	/* 使用指针访问值 */
	fmt.Printf("*ip 变量的值: %d\n", *ip)

	/*
		空指针
		值为nil（也就是零值）
	*/
	var ptr *int
	var ptr2 *string

	fmt.Printf("ptr 的值为 : %x\n", ptr)   //0
	fmt.Printf("ptr2 的值为 : %x\n", ptr2) //0
	fmt.Println(ptr == nil)             //true
}
